package com.ywx.intelligentaicodegeneration.core.saver;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.ywx.intelligentaicodegeneration.constant.AppConstant;
import com.ywx.intelligentaicodegeneration.exception.ErrorCode;
import com.ywx.intelligentaicodegeneration.exception.ThrowUtils;
import com.ywx.intelligentaicodegeneration.mode.enums.CodeGenTypeEnum;
import java.io.File;
import java.nio.charset.StandardCharsets;

public abstract class CodeFileSaverTemplate<T> {
    // 文件保存根目录
    private static final String FILE_SAVE_ROOT_DIR = AppConstant.CODE_OUTPUT_ROOT_DIR;

    /**
     * 模板方法,保存代码的标准流程
     *
     * @param result 生成结果
     * @param appId   应用Id
     * @return 保存到的目录对象
     */
    public final File saveCode(T result,Long appId) {
        //1.验证输入
        validateInput(result);
        //2.构建唯一目录
        String baseDirPath = buildUniqueDirPath(appId);
        //3.保存文件
        saveFiles(result, baseDirPath);
        //4.返回保存的目录对象
        return new File(baseDirPath);
    }


    /**
     * 验证输入
     *
     * @param result 生成结果
     */
    protected void validateInput(T result) {
        ThrowUtils.throwIf(result == null, ErrorCode.PARAMS_ERROR, "代码构建结果不能为空");
    }


    /**
     * 构建唯一目录   tmp/code_output/bizType_应用Id
     *
     * @param appId 应用Id
     * @return 唯一目录路径
     */
    protected final String buildUniqueDirPath(Long appId) {
        ThrowUtils.throwIf(appId == null, ErrorCode.PARAMS_ERROR, "应用Id不能为空");
        String bizType = getCodeType().getValue();
        String uniqueDirName = StrUtil.format("{}_{}", bizType, appId);
        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniqueDirName;
        FileUtil.mkdir(dirPath);
        return dirPath;
    }

    /**
     * 写入单个文件的工具方法
     *
     * @param path     路径
     * @param filename 文件名
     * @param content  内容
     */
    protected final void writeToFile(String path, String filename, String content) {
        if (StrUtil.isNotBlank(content)) {
            FileUtil.writeString(content, path + File.separator + filename, StandardCharsets.UTF_8);
        }
    }

    /**
     * 保存文件
     *
     * @param result      生成结果
     * @param baseDirPath 基础目录路径
     */
    protected abstract void saveFiles(T result, String baseDirPath);

    /**
     * 获取代码生成类型
     *
     * @return 代码生成类型枚举
     */
    public abstract CodeGenTypeEnum getCodeType();

}
